package cn.com.yang.nio;


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @Author 杨亿金
 * @Date 2021/12/7 22:22
 * @CopyRight
 * @Version
 */
public class BufferDemo {
   
    public static void main(String[] args) {
        //这里用的文件I/O处理
        FileInputStream fin;
		try {
			fin = new FileInputStream("E://test.txt");
			 //创建文件的操作通道
	        FileChannel fileChannel = fin.getChannel();

	        //分配一个10大小的缓冲区，其实就是分配一个10大小的Byte数组
	        ByteBuffer buffer = ByteBuffer.allocate(10);
	        output("初始化",buffer);
	        fileChannel.read(buffer);
	        output("调用read()",buffer);
	        //准备操作之前，先锁定操作范围
	        buffer.flip();
	        output("调用flip()",buffer);
	        //判断有没有可读数据
	        while (buffer.remaining()>0){
	            byte b = buffer.get();
	        }
	        output("调用get()",buffer);

	        //可以理解为解锁
	        buffer.clear();
	        output("调用clear()",buffer);

	        //最后把管道关闭
	        fin.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
    }

    /**
     *
     * @param 初始化
     * @param buffer
     */
    private static void output(String 初始化, ByteBuffer buffer) {
        System.out.println(初始化 +"");
        //容量，数组大小
        System.out.print("capacity:"+buffer.capacity() + ",");
        //当前操作数据所在的位置，也可以叫做游标
        System.out.print("position:"+buffer.position()+",");
        //锁定值，flip,数据操作范围索引只能在position-limit之间
        System.out.println("limit:"+buffer.limit());
        System.out.println();
    }
}
